﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public class SettlementsCollection : AbstractCollection
    {
        /// <summary>
        /// Вьюшка с городами
        /// </summary>
        private static List<v_Settlements> vSettlements;

        /// <summary>
        /// Статическая коллекция населённых пунктов
        /// </summary>
        private static List<Settlements> _list;

        #region Implementation of IGetItem

        /// <summary>
        /// Получение типа текущего элемента
        /// </summary>
        /// <returns></returns>
        protected override Type GetItemType()
        {
            return typeof (Settlements);
        }

        /// <summary>
        /// Получение статического списка для хранения объектов
        /// </summary>
        /// <returns></returns>
        public override object GetStaticCollection()
        {
            return _list;
        }

        /// <summary>
        /// Получение элемента из коллекции по идентификатору
        /// </summary>
        /// <param name="itemId">Идентификатор</param>
        /// <returns>Элемент</returns>
        public override object GetItemById(int itemId)
        {
            return Entities.Settlements.Find(itemId);
        }

        /// <summary>
        /// Обнуление статической коллекции
        /// </summary>
        protected override void SetStaticListToNULL()
        {
            _list = null;
        }

        #endregion

        #region Implementation of IGetIdByName

        /// <summary>
        /// Получение списка элементов
        /// </summary>
        /// <returns>Список элементов</returns>
        public override List<object> GetList()
        {
            return new List<object>(SettlementsList);
        }

        #endregion

        /// <summary>
        /// Список населённых пунктов
        /// </summary>
        public List<Settlements> SettlementsList
        {
            get { return Entities.Settlements.AsNoTracking().ToList(); }
        }

        /// <summary>
        /// Вьюшка с городами
        /// </summary>
        public List<v_Settlements> VSettlements
        {
            get { return Entities.v_Settlements.AsNoTracking().ToList(); }
        }


        /// <summary>
        /// Получить идентификатор страны по идентификатору города
        /// </summary>
        /// <param name="settlementId">Иденитификатор города</param>
        /// <returns>Идентификатор страны</returns>
        public int GetCountryIdBySetllementId(int settlementId)
        {
            Districts distr = GetDistrictBySettlementId(settlementId);
            if (distr != null)
                if (distr.IdCountry != null) return (int) distr.IdCountry;
            return 0;
        }


        /// <summary>
        /// Получение страны по идентификатору населённого пункта
        /// </summary>
        /// <param name="settlementId">Идентификатор населённого пункта</param>
        /// <returns>Страна</returns>
        public Countries GetCountryBySettlementId(int settlementId)
        {
            int id = GetCountryIdBySetllementId(settlementId);
            return Entities.Countries.Find(id);
        }


        /// <summary>
        /// Получить идентификатор District по идентификатору города
        /// </summary>
        /// <param name="settlementId">Идентификатор города</param>
        /// <returns>Идентификатор District</returns>
        public int GetDistrictIdBySettlementId(int settlementId)
        {
            Regions region = GetRegionBySettlementId(settlementId);
            if (region != null)
            {
                if (region.IdDistrict != null) return (int) region.IdDistrict;
            }
            return 0;
        }

        /// <summary>
        /// Получение дистркта по идентификатору населённого пункта
        /// </summary>
        /// <param name="settlementId">Идентификатор населённого пункта</param>
        /// <returns>Дистрикт</returns>
        public Districts GetDistrictBySettlementId(int settlementId)
        {
            int id = GetDistrictIdBySettlementId(settlementId);
            return Entities.Districts.Find(settlementId);
        }

        /// <summary>
        /// Получение идентификатора района по идентификатору города
        /// </summary>
        /// <param name="settlementId">Идентификатор города</param>
        /// <returns>Идентификатор района</returns>
        public int GetAreaIdBySettlementId(int settlementId)
        {
            Settlements settlement = Entities.Settlements.Find(settlementId);
            if (settlement != null)
            {
                if (settlement.IdArea != null) return (int) settlement.IdArea;
            }
            return 0;
        }


        /// <summary>
        /// Получение идентификатора региона по идентификатору города
        /// </summary>
        /// <param name="settlementId">Идентификатор города</param>
        /// <returns>Идентификатор региона</returns>
        public int GetRegionIdBySettlementId(int settlementId)
        {
            Settlements settlement = GetSettlementById(settlementId);
            if (settlement != null)
            {
                if (settlement.IdRegion != null) return (int) settlement.IdRegion;
            }
            return 0;
        }


        /// <summary>
        /// Получение региона по идентифкатору населённого пункта
        /// </summary>
        /// <param name="settlementId">Идентификатор населённого пункта</param>
        /// <returns>Регион</returns>
        public Regions GetRegionBySettlementId(int settlementId)
        {
            int regionId = GetRegionIdBySettlementId(settlementId);
            return Entities.Regions.Find(regionId);
        }


        /// <summary>
        /// Получение населённого пункта по идентификатору
        /// </summary>
        /// <param name="settlementId">Идентификатор</param>
        /// <returns>Населённый пункт</returns>
        public Settlements GetSettlementById(int settlementId)
        {
            return Entities.Settlements.Find(settlementId);
        }

        /// <summary>
        /// Получение идентификатора региона профайн по идентификатору города
        /// </summary>
        /// <param name="settlementId">Идентификатор города</param>
        /// <returns>Идентификатор региона профайн</returns>
        public int GetprofineRegionIdBySettlementId(int settlementId)
        {
            Regions region = GetRegionBySettlementId(settlementId);
            if (region != null)
                if (region.IdProfineRegion != null) return (int) region.IdProfineRegion;
            return 0;
        }


        /// <summary>
        /// Получение региона профайн по идентификатору населённого пункта
        /// </summary>
        /// <param name="settlementId">Идентификатор населённого пункта</param>
        /// <returns>Регион профайн</returns>
        public profineRegions GetProfineRegionBySettlementId(int settlementId)
        {
            int id = GetprofineRegionIdBySettlementId(settlementId);
            return Entities.profineRegions.Find(id);
        }
    }
}